Many computing systems support the execution of multiple threads to perform tasks in parallel. During execution, the threads may contend for access to a shared resource that is necessary to complete their tasks. The computing systems may handle contention by allowing multiple threads to wait (e.g., sleep) for a particular shared resource and while they are waiting may associate the threads with a condition variable. When the resource is modified the computing system may access the condition variable to determine which threads are waiting and subsequently send a notification to wake them up.